const commonMethod = "ctListen";
// 管道集合
const queueMap = new Map();
// 全局监听
let postMessageListenerFlag = false;
if (!postMessageListenerFlag) {
  // prettier-ignore
  window.addEventListener("message", function (event) {// NOSONAR
    postMessageListenerFlag = true;
    // 事件过滤
    if (event.data.type !== "S-IFRAME") return;
    // 来源页面地址
    const sourceUrl = event.data.sourceUrl;
    // 执行集合中方法
    const viewId = event.data?.originUrl
      ? getParam(event.data.originUrl, "viewId") || ""
      : "";
    try {
      if (
        event.data?.originUrl &&
        viewId &&
        queueMap.has(event.data.method + sourceUrl + viewId)
      ) {
        queueMap
          .get(event.data.method + sourceUrl + viewId)
          .fn(event.data.data);
      } else {
        queueMap.get(event.data.method + sourceUrl).fn(event.data.data);
      }
    } catch (e) {
      //TODO handle the exception
    }
  });
}

/**
 *
 * @param {*} url url地址
 * @param {*} mode 模式，0为域名，1为全路径
 * @returns
 */
function parseUrl(url, mode = "domain") {
  let urls = "";
  if (mode === "domain") {
    urls = url.split("/");
    return `${urls[0]}/${urls[1]}/${urls[2]}/`;
  } else {
    // 获取？前面的网站路径
    urls = url.split("?");
    return urls[0].endsWith("/") ? `${urls[0]}` : `${urls[0]}/`;
  }
}

/**
 * 获取url指定的param
 *
 * @param {*} url
 * @param {*} param
 *
 * @returns
 */
function getParam(url, param) {
  return new URLSearchParams(new URL(url).search).get(param);
}

/**
 * 给子页面传值
 * @param {*} iframe
 * @param {*} methodName
 * @param {*} data
 * @param {*} fn 回掉函数
 * @param {*} mode 模式，0为域名 1为全网址
 */
function postToIframe(iframe, methodName, data, fn) {
  // 目标iframe地址 通常指子页面地址
  const mode = iframe.getAttribute("data-mode") || "domain";
  // prettier-ignore
  iframe.contentWindow.postMessage( // NOSONAR
    {
      method: methodName || commonMethod,
      data: data,
      type: "S-IFRAME",
      sourceUrl: parseUrl(iframe.src, mode),
      originUrl: iframe.src,
    },
    "*"
  );
  // 注册回调方法
  fn && listen(methodName, fn, iframe);
}

/**
 * 给父级页面传值
 * @param {*} methodName
 * @param {*} data
 */
function postToParent(methodName, data, fn) {
  // prettier-ignore
  window.parent.postMessage( // NOSONAR
    {
      method: methodName || commonMethod,
      data: data,
      type: "S-IFRAME",
      sourceUrl: window.location.origin + "/",
      originUrl: window.location.href,
    },
    "*"
  );
  // 注册回调方法
  fn && listen(methodName, fn);
}

/**
 * 注册监听事件
 * @param methodName
 * @param fn
 * @param iframe
 */
function listen(methodName, fn, iframe) {
  const mode = iframe.getAttribute("data-mode") || "domain";
  //console.log("mode::", mode, iframe.src, iframe);
  //console.log("注册监听事件", parseUrl(iframe.src, mode), iframe.src);
  // const hostUrl = iframe ? parseUrl(iframe.src) : location.origin + '/'
  const hostUrl = iframe
    ? parseUrl(iframe.src, mode)
    : parseUrl(location.href, mode);
  const viewId = iframe
    ? getParam(iframe.src, "viewId") || ""
    : getParam(location.href, "viewId") || "";
  queueMap.set(methodName + hostUrl, { fn });
  queueMap.set(methodName + hostUrl + viewId, { fn });
  // console.log(
  //   "【siframe】【listen】【hostUrl】",
  //   hostUrl,
  //   "【queueMap】",
  //   queueMap
  // );
}

/**
 * 发送消息
 * @param iframe
 * @param methodName
 * @param data
 * @param fn
 * @param mode 模式，0为域名 1为全网址
 */
function trigger(iframe, methodName, data, fn) {
  if (iframe) {
    postToIframe(iframe, methodName, data, fn);
  } else {
    postToParent(methodName, data, fn);
  }
}

export default {
  listen,
  trigger,
};
